package com.core.cloudcommon;

import com.core.cloudcommon.trace.TraceContext;
import lombok.Data;

import java.io.Serializable;
import java.util.UUID;

/**
 * @author =====Lqj=====
 * @className Result
 * @description
 * @create 2024/11/12 21:47
 **/
@Data
public class CommonResult<T> {


    /**
     * 返回代码
     */
    private Integer code = CommonResultCode.CODE200.getCode();


    /**
     * 成功标志
     */
    private boolean success = true;

    /**
     * 返回处理消息
     */

    private String message = CommonResultCode.CODE200.getMsg();

    public String requuid;


    /**
     * 时间戳
     */
    private Long timestamp = System.currentTimeMillis();

    /**
     * 链路追踪ID，用于排查日志
     */
    private String traceId;

    /**
     * 返回数据对象 data
     */
    private T result;


    public CommonResult() {
        // 自动设置链路ID
        this.traceId = TraceContext.getTraceId();
        if (this.traceId == null) {
            this.traceId = UUID.randomUUID().toString().replace("-", "");
        }
    }

    /**
     * 无参数返回
     *
     * @param <T>
     * @return
     */
    public static <T> CommonResult<T> OK() {
        CommonResult<T> r = new CommonResult<T>();
        r.setSuccess(true);
        r.setCode(CommonResultCode.CODE200.getCode());
        r.setMessage(CommonResultCode.CODE200.getMsg());
        return r;
    }

    /**
     * 有参数返回
     *
     * @param data 响应给前端数据
     * @param <T>
     * @return
     */
    public static <T> CommonResult<T> OK(T data) {
        CommonResult<T> r = new CommonResult<T>();
        r.setSuccess(true);
        r.setCode(CommonResultCode.CODE200.getCode());
        r.setMessage(CommonResultCode.CODE200.getMsg());
        r.setResult(data);
        return r;
    }

    /**
     * 通过编码返回错误信息
     *
     * @param code 编码
     * @return
     */
    public static CommonResult<Object> error(Integer code) {
        CommonResult<Object> r = new CommonResult<Object>();
        CommonResultCode byCode = CommonResultCode.getByCode(code);
        r.setCode(byCode.getCode());
        r.setMessage(byCode.getMsg());
        r.setSuccess(false);
        return r;
    }

    /**
     * 通过编码返回带错误数据
     *
     * @param code 编码
     * @param data 数据
     * @param <T>
     * @return
     */
    public static <T> CommonResult<T> error(Integer code, T data) {
        CommonResult<T> r = new CommonResult<T>();
        CommonResultCode byCode = CommonResultCode.getByCode(code);
        r.setSuccess(false);
        r.setCode(byCode.getCode());
        r.setMessage(byCode.getMsg());
        r.setResult(data);
        return r;
    }

    /**
     * 通过编码和自定义消息返回错误信息
     *
     * @param code    编码
     * @param message 自定义消息
     * @return
     */
    public static CommonResult<Object> error(Integer code, String message) {
        CommonResult<Object> r = new CommonResult<Object>();
        r.setSuccess(false);
        r.setCode(code);
        r.setMessage(message);
        return r;
    }

    /**
     * 通过编码、自定义消息和数据返回错误信息
     *
     * @param code    编码
     * @param message 自定义消息
     * @param data    数据
     * @param <T>
     * @return
     */
    public static <T> CommonResult<T> error(Integer code, String message, T data) {
        CommonResult<T> r = new CommonResult<T>();
        r.setSuccess(false);
        r.setCode(code);
        r.setMessage(message);
        r.setResult(data);
        return r;
    }

    /**
     * 返回错误信息（使用默认错误码400）
     *
     * @param message 错误消息
     * @return
     */
    public static CommonResult<Object> ERROR(String message) {
        return error(CommonResultCode.CODE400.getCode(), message);
    }

    /**
     * 返回错误信息和数据（使用默认错误码400）
     *
     * @param message 错误消息
     * @param data    数据
     * @param <T>
     * @return
     */
    public static <T> CommonResult<T> ERROR(String message, T data) {
        return error(CommonResultCode.CODE400.getCode(), message, data);
    }
}
